{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Домашняя работа по уроку \"Основы Python\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Задание 1\n",
    "Даны 2 переменных, в которых хранятся строки произвольной длины: phrase_1 и phrase_2.\n",
    "Напишите код, который проверяет какая из этих строк длиннее."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Длина фразы в переменной phrase_2 больше, чем в переменной phrase_1\n"
     ]
    }
   ],
   "source": [
    "phrase_1 = \"Утро было солнечным, но немного дождливым\"\n",
    "phrase_2 = \"Все выходные планирую изучать Python и добиваться выдающихся результатов\"\n",
    "\n",
    "if len(phrase_1) > len(phrase_2):\n",
    "    print('Длина фразы в переменной phrase_1 больше, чем в переменной phrase_2')\n",
    "elif len(phrase_1) < len(phrase_2):\n",
    "    print('Длина фразы в переменной phrase_2 больше, чем в переменной phrase_1')\n",
    "else:\n",
    "    print('Длина фраз phrase_1 и phrase_2 одинакова')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Задание 2\n",
    "\n",
    "Дана переменная, в которой хранится четырехзначное число (год). Необходимо написать программу, которая выведет, является ли данный год високосным или обычным."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Год 2020 - високосный\n"
     ]
    }
   ],
   "source": [
    "year = 2020\n",
    "\n",
    "# Находим остаток от деления на 4\n",
    "year_mod_4 = year % 4\n",
    "\n",
    "# Находим остаток от деления на 400\n",
    "year_mod_400 = year % 400\n",
    "\n",
    "# Проверка года на признак столетия, если год без остатка делится на 100, флаг is_century принимает значение True\n",
    "if year % 100:\n",
    "    is_century = False\n",
    "else:\n",
    "    is_century = True\n",
    "    \n",
    "if year_mod_4 > 0:\n",
    "    print(f'Год {year} - не високосный')\n",
    "elif is_century:\n",
    "    if year_mod_400 == 0:\n",
    "        print(f'Год {year} - високосный')\n",
    "    else:\n",
    "        print(f'Год {year} - не високосный') \n",
    "else:\n",
    "    print(f'Год {year} - високосный')\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Задание 3\n",
    "Необходимо написать программу, которая будет запрашивать у пользователя месяц и дату рождения и выводить соответствующий знак зодиака."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Введите название месяца Вашего рождения: Март\n",
      "Введите день Вашего рождения: 07\n",
      "Ваш знак зодиака - Рыбы\n"
     ]
    }
   ],
   "source": [
    "\"\"\"\n",
    "Формируем списки для проверки пользовательского ввода.\n",
    "Считаем эту задачу учебной и для упрощения решения не будем проверять может ли указанный номер дня входить в текущий месяц. \n",
    "Например, 31 февраля точно не бывает, но программа в этом случае не будет ругаться на пользовательский ввод. \n",
    "Также знак зодиака может зависеть от конкретного года. Для расчетов берем календарь на 2020 год.\n",
    "\"\"\"\n",
    "month_names_list = ('январь', 'февраль', 'март', 'апрель', 'май', 'июнь', \n",
    "                    'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь')\n",
    "# Список дней должен учитывать ввод в формате 01 для дней от 1 до 9\n",
    "day_numbers_list = [str(day_number) for day_number in range(1,32)]\n",
    "day_numbers_list += ['0'+str(day_number) for day_number in range(1,10)]\n",
    "\n",
    "while True:\n",
    "    month_name = input(\"Введите название месяца Вашего рождения: \")\n",
    "    month_name = month_name.lower().strip()\n",
    "    if month_name not in month_names_list:\n",
    "        print('Название месяца введено некорректно! Введите название месяца правильно, например, Август.')\n",
    "        print('Название месяца не должно содержать никаких дополнительных символов')\n",
    "        continue\n",
    "    break\n",
    "    \n",
    "while True:\n",
    "    day_number = input(\"Введите день Вашего рождения: \")\n",
    "    if day_number not in day_numbers_list:\n",
    "        print('День рождения задан некорректно, введите число. Например, 23. Число должно лежать в диапазоне от 1 до 31.')\n",
    "        continue\n",
    "    day_number = int(day_number)\n",
    "    break\n",
    "    \n",
    "if month_name == 'январь':\n",
    "    if day_number in range(1,21):\n",
    "        print(\"Ваш знак зодиака - Козерог\")\n",
    "    else:\n",
    "        print(\"Ваш знак зодиака - Водолей\")\n",
    "elif month_name == 'февраль':\n",
    "    if day_number in range(1,20):\n",
    "        print(\"Ваш знак зодиака - Водолей\")\n",
    "    else:\n",
    "        print(\"Ваш знак зодиака - Рыбы\")\n",
    "elif month_name == 'март':\n",
    "    if day_number in range(1,21):\n",
    "        print(\"Ваш знак зодиака - Рыбы\")\n",
    "    else:\n",
    "        print(\"Ваш знак зодиака - Овен\")\n",
    "elif month_name == 'апрель':\n",
    "    if day_number in range(1,21):\n",
    "        print(\"Ваш знак зодиака - Овен\")\n",
    "    else:\n",
    "        print(\"Ваш знак зодиака - Телец\")\n",
    "elif month_name == 'май':\n",
    "    if day_number in range(1,22):\n",
    "        print(\"Ваш знак зодиака - Телец\")\n",
    "    else:\n",
    "        print(\"Ваш знак зодиака - Близнецы\")\n",
    "elif month_name == 'июнь':\n",
    "    if day_number in range(1,22):\n",
    "        print(\"Ваш знак зодиака - Близнецы\")\n",
    "    else:\n",
    "        print(\"Ваш знак зодиака - Рак\")\n",
    "elif month_name == 'июль':\n",
    "    if day_number in range(1,23):\n",
    "        print(\"Ваш знак зодиака - Рак\")\n",
    "    else:\n",
    "        print(\"Ваш знак зодиака - Лев\")\n",
    "elif month_name == 'август':\n",
    "    if day_number in range(1,22):\n",
    "        print(\"Ваш знак зодиака - Лев\")\n",
    "    else:\n",
    "        print(\"Ваш знак зодиака - Дева\")\n",
    "elif month_name == 'сентябрь':\n",
    "    if day_number in range(1,24):\n",
    "        print(\"Ваш знак зодиака - Дева\")\n",
    "    else:\n",
    "        print(\"Ваш знак зодиака - Весы\")\n",
    "elif month_name == 'октябрь':\n",
    "    if day_number in range(1,25):\n",
    "        print(\"Ваш знак зодиака - Весы\")\n",
    "    else:\n",
    "        print(\"Ваш знак зодиака - Скорпион\")\n",
    "elif month_name == 'ноябрь':\n",
    "    if day_number in range(1,23):\n",
    "        print(\"Ваш знак зодиака - Весы\")\n",
    "    else:\n",
    "        print(\"Ваш знак зодиака - Стрелец\")\n",
    "elif month_name == 'декабрь':\n",
    "    if day_number in range(1,23):\n",
    "        print(\"Ваш знак зодиака - Стрелец\")\n",
    "    else:\n",
    "        print(\"Ваш знак зодиака - Козерог\")\n",
    "else:\n",
    "    print(\"Не удалось определить знак зодиака :(\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Задание 4\n",
    "\n",
    "Нужно написать программу для подбора упаковок по размерам товара. Размеры хранятся в переменных (в сантиметрах):\n",
    "\n",
    "width = 10\n",
    "length = 205\n",
    "height = 5\n",
    "\n",
    "Использовать следующие правила:\n",
    "\n",
    "- если каждое из трех измерений менее 15 сантиметров, то вывести на экран “Коробка №1”;\n",
    "- если хотя бы одно из измерений больше 15 сантиметров, но менее 50 сантиметров, то вывести “Коробка №2”;\n",
    "- если длина товара больше 2 метров, то вывести “Упаковка для лыж”;\n",
    "- во всех остальных случаях вывести  “Стандартная коробка №3”."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Коробка №2\n"
     ]
    }
   ],
   "source": [
    "width = 16\n",
    "length = 200\n",
    "height = 45\n",
    "\n",
    "if width < 15 and length < 15 and height < 15:\n",
    "    print('Коробка №1')\n",
    "elif (15 < width < 50 or 15 < length < 50 or 15 < height < 50) and length <= 200:\n",
    "    print('Коробка №2')\n",
    "elif length > 200:\n",
    "    print('Коробка для лыж')\n",
    "else:\n",
    "    print('Стандартная коробка №3')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Задание 5 (необязательное)\n",
    "\n",
    "Дана переменная, в которой хранится шестизначное число (номер проездного билета). Напишите программу, которая будет определять, является ли данный билет “счастливым”. Билет считается счастливым, если сумма первых трех цифр совпадает с суммой последних трех цифр номера."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Обычный билетик :(\n"
     ]
    }
   ],
   "source": [
    "ticket_number = 111112\n",
    "ticket_numbers_list = [int(num) for num in str(ticket_number)]\n",
    "FIRST_THREE_NUMBERS = slice(0,3)\n",
    "LAST_THREE_NUMBERS = slice(3,6)\n",
    "if sum(ticket_numbers_list[FIRST_THREE_NUMBERS]) == sum(ticket_numbers_list[LAST_THREE_NUMBERS]):\n",
    "    print('Билетик счастливый!')\n",
    "else:\n",
    "    print('Обычный билетик :(')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Задание 6 (необязательное)\n",
    "\n",
    "Напишите программу, которая сможет вычислять площади трех фигур (круг, треугольник и прямоугольник). \n",
    "Тип фигуры запрашиваем через пользовательский ввод, после чего делаем запрос характеристик фигуры:\n",
    "\n",
    "- если пользователь выбрал круг, запрашиваем его радиус,\n",
    "- если треугольник – длины трех его сторон;\n",
    "- если прямоугольник – длины двух его сторон."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Введите название фигуры: треугольник\n",
      "Введите размер стороны а: 25\n",
      "Введите размер стороны b: 25\n",
      "Введите размер стороны c: 9\n",
      "Площадь треугольника: 110.66249364622144\n"
     ]
    }
   ],
   "source": [
    "import math\n",
    "import re\n",
    "\n",
    "\n",
    "# Переменная для проверки пользовательского ввода, фигуры должны находитсья в списке\n",
    "shape_type_names = ('треугольник','круг','прямоугольник')\n",
    "\n",
    "\n",
    "def get_triangle_area(a,b,c):\n",
    "    \"\"\"Функция для расчета площадки треугольника\"\"\"\n",
    "    p = (a+b+c)/2\n",
    "    try:\n",
    "        s = math.sqrt(p*(p-a)*(p-b)*(p-c))\n",
    "    except:\n",
    "        return None\n",
    "    return s\n",
    "\n",
    "\n",
    "def get_circle_area(r):\n",
    "    \"\"\"Функция для расчета площадки круга\"\"\"\n",
    "    return math.pi*r*r\n",
    "\n",
    "\n",
    "def get_rectangle_area(a, b):\n",
    "    \"\"\"Функция для расчета площадки прямоугольника\"\"\"\n",
    "    return a*b\n",
    "\n",
    "\n",
    "def check_number(number):\n",
    "    \"\"\"Функция проверяет является ли число положительным натуральным или положительной десятичной дробью\"\"\"\n",
    "    number = str(number)\n",
    "    if re.compile(r'^0\\.\\d+|[1-9]\\d+\\.\\d+|[1-9]\\d*$').search(number) is None:\n",
    "        return 1\n",
    "    return 0\n",
    "\n",
    "\n",
    "def check_traingle_sides(a, b, c):\n",
    "    \"\"\"Функция проверки корректности значений сторон треугольника\"\"\"\n",
    "    if a > b+c:\n",
    "        return 1\n",
    "    if b > a+c:\n",
    "        return 2\n",
    "    if c > a+b:\n",
    "        return 3\n",
    "    return 0\n",
    "\n",
    "\n",
    "def interactive_get_triangle_area():\n",
    "    \"\"\"Функция для интерактивного расчета площади треугольника\"\"\"\n",
    "    \n",
    "    while True:\n",
    "        a = input(\"Введите размер стороны а: \")\n",
    "        return_code = check_number(a)\n",
    "        if return_code != 0:\n",
    "            print('Некорректно введена длина стороны а, требуется положительное натуральное или десятичная дробь')\n",
    "            continue\n",
    "        a = float(a)\n",
    "        break\n",
    "        \n",
    "    while True:\n",
    "        b = input(\"Введите размер стороны b: \")\n",
    "        return_code = check_number(b)\n",
    "        if return_code != 0:\n",
    "            print('Некорректно введена длина стороны b, требуется положительное натуральное или десятичная дробь')\n",
    "            continue\n",
    "        b = float(b)\n",
    "        break\n",
    "        \n",
    "    while True:\n",
    "        c = input(\"Введите размер стороны c: \")\n",
    "        return_code = check_number(c)\n",
    "        if return_code != 0:\n",
    "            print('Некорректно введена длина стороны c, требуется положительное натуральное или десятичная дробь')\n",
    "            continue\n",
    "        c = float(c)\n",
    "        break\n",
    "       \n",
    "    return_code = check_traingle_sides(a,b,c)\n",
    "    if return_code == 1:\n",
    "        print(f'Невозможно найти площадь, сторона a должна быть меньше суммы сторон b и c')\n",
    "        return\n",
    "    if return_code == 2:\n",
    "        print(f'Невозможно найти площадь, сторона b должна быть меньше суммы сторон a и c')\n",
    "        return\n",
    "    if return_code == 3:\n",
    "        print(f'Невозможно найти площадь, сторона c должна быть меньше суммы сторон a и b')\n",
    "        return\n",
    "    s = get_triangle_area(a,b,c)\n",
    "    if s is None:\n",
    "        print(f'не удалось расчитать площадь треугольника из-за системной ошибки')\n",
    "        return\n",
    "    \n",
    "    print(f'Площадь треугольника: {s}')\n",
    "    \n",
    "    \n",
    "def interactive_get_rectangle_area():\n",
    "    \"\"\"Функция для интерактивного расчета площади прямоугольника\"\"\"\n",
    "    \n",
    "    while True:\n",
    "        a = input(\"Введите размер стороны а: \")\n",
    "        return_code = check_number(a)\n",
    "        if return_code != 0:\n",
    "            print('Некорректно введена длина стороны а, требуется положительное натуральное или десятичная дробь')\n",
    "            continue\n",
    "        a = float(a)\n",
    "        break\n",
    "        \n",
    "    while True:\n",
    "        b = input(\"Введите размер стороны b: \")\n",
    "        return_code = check_number(b)\n",
    "        if return_code != 0:\n",
    "            print('Некорректно введена длина стороны b, требуется положительное натуральное или десятичная дробь')\n",
    "            continue\n",
    "        b = float(b)\n",
    "        break\n",
    "        \n",
    "    s = get_rectangle_area(a,b)\n",
    "        \n",
    "    print(f'Площадь прямоугольника: {s}')\n",
    "    \n",
    "\n",
    "def interactive_get_circle_area():\n",
    "    \"\"\"Функция для интерактивного расчета площади круга\"\"\"\n",
    "    \n",
    "    while True:\n",
    "        r = input(\"Введите радиус круга: \")\n",
    "        return_code = check_number(r)\n",
    "        if return_code != 0:\n",
    "            print('Некорректно введен радиус круга, требуется положительное натуральное или десятичная дробь')\n",
    "            continue\n",
    "        r = float(r)\n",
    "        break\n",
    "        \n",
    "    s = get_circle_area(r)\n",
    "    \n",
    "    print(f'Площадь круга: {s}')\n",
    "    \n",
    "            \n",
    "def main():\n",
    "    \"\"\"Главная функция для запуска калькулятора\"\"\"\n",
    "    \n",
    "    while True:\n",
    "        shape_type = input(\"Введите название фигуры: \")\n",
    "        shape_type = shape_type.lower().strip()\n",
    "        if shape_type not in shape_type_names:\n",
    "            print('Тип фигуры введен неверно, можно указать 3 типа:\\n - треугольник\\n - круг\\n - прямоугольник\\n')\n",
    "            continue\n",
    "        break\n",
    "    if shape_type == 'треугольник':\n",
    "        interactive_get_triangle_area()\n",
    "    if shape_type == 'прямоугольник':\n",
    "        interactive_get_rectangle_area()\n",
    "    if shape_type == 'круг':\n",
    "        interactive_get_circle_area()\n",
    "        \n",
    "        \n",
    "main()\n",
    "    "
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
